package com.wyd.strategy.demo2;

import com.wyd.strategy.demo2.behavior.FlyBebahavior;
import com.wyd.strategy.demo2.behavior.QuackBehavior;

/**
 * 策略模式
 * @author Yudi Wang
 * @date 2022/1/5 16:49
 */
public abstract class Duck {

    /**
     * 多组合，少继承
     * 面向接口
     */
    protected FlyBebahavior flyBebahavior;

    protected QuackBehavior quackBehavior;

    /**
     * 动态地改变对象行为
     * @param flyBebahavior
     */
    public void setFlyBebahavior(FlyBebahavior flyBebahavior) {
        this.flyBebahavior = flyBebahavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    protected void display() {
        System.out.println("duck");
    }

    protected void quack() {
        quackBehavior.performQuack();
    }

    /**
     * 将变化的部分封装，委托给抽象接口（多态，面向接口编程）
     *
     */
    protected void fly() {
        flyBebahavior.performFly();
    }
}
